package com.zhanghp.class003;

import static com.zhanghp.class003.BinaryPrint.print;

/**
 * @author zhanghp
 * @since 2024/2/7 13:51
 */
public class BinarySystem {

    public static void main(String[] args) {
        /**
         * 非负数
         */
        int a = 20;
        System.out.println(a);
        print(a);
        /**
         * 负数
         */
        int b = -20;
        System.out.println(b);
        print(b);

        System.out.println("=====非负数/负数=====");

        /**
         * 负数 <-> 非负数
         * 负数   = ~非负数 + 1
         * 非负数 = ~（ 负数 - 1）
         */
        // 非负数 -》 负数
        int c = 30;
        System.out.println(~c);
        System.out.println(~c + 1);
        print(~c);
        print(~c + 1);

        // 负数 -》 非负数
        int d = -30;
        System.out.println(~(d - 1));
        System.out.println(-d);
        print(~(d-1));

        System.out.println("=====非负数《 - 》负数=====");

        /**
         * 二进制 与 十六进制
         * ---------------
         * 二进制：0101 1100
         *         5   12
         * 十六进制：0x5c
         */
        int e = 0b0101_1100;
        System.out.println(e);
        print(e);

        int f = 0x5c;
        System.out.println(f);
        print(f);

        System.out.println("=====二进制 与 十六进制=====");

        // 整数最小值特殊性(取绝对值还是自己)
        System.out.println("int 测试");
        int g = 1 << 31;
        int h = Integer.MIN_VALUE;
        System.out.println(g);
        System.out.println(h);
        System.out.println(g == h); //true
        print(g);
        System.out.println(~Integer.MAX_VALUE + 1);
        System.out.println(Integer.MAX_VALUE);
        System.out.println(((~Integer.MAX_VALUE) + 1 -1)== h); // true

        System.out.println("long 测试");
        long i = 1L << 63;
        long j = Long.MIN_VALUE;
        System.out.println(i);
        System.out.println(j);
        System.out.println(i == j); // true
        System.out.println(Long.MAX_VALUE);
        System.out.println("=====整数最小值特殊性=====");

        /**
         * | & ^
         */
        int k = 0b1010;
        int l = 0b1100;
        print(k | l); // 有1就为1
        print(k & l); // 都为1才是1
        print(k ^ l); // 不同为1 相同为0

        System.out.println("=====| & ^=====");

        /**
         * 逻辑运算
         */
        // | || & &&
        System.out.println("test1");
        System.out.println(returnTrue() | returnFalse());
        System.out.println("test2");
        System.out.println(returnTrue() || returnFalse());
        System.out.println("test3");
        System.out.println(returnFalse() & returnTrue());
        System.out.println("test4");
        System.out.println(returnFalse() && returnTrue());

        System.out.println("=====逻辑运算=====");

        /**
         * << >> >>>
         */
        // <<
        int m = 2;
        System.out.println(m << 1);
        System.out.println(m >> 2);
        System.out.println(m << 3);

        // 非负数 效果一样 >> >>>
        System.out.println(m >> 1);
        System.out.println(m >>> 1);

        // 负数 >> >>>
        int n = 0b1111_0000_0000_0000_0000_0000_0000_0000;
        // 拿符号补，用1补左边空缺的2位
        print(n >> 2);
        // 无符号右移，拿0来补空缺的2位
        print(n >>> 2);

        System.out.println("=====有/无符号位运算=====");
        // 非负数 << 1，等同于乘以2
        // 非负数 << 2，等同于乘以4
        // 非负数 << 3，等同于乘以8
        // 非负数 << i，等同于乘以2的i次方
        // ...
        // 非负数 >> 1，等同于除以2
        // 非负数 >> 2，等同于除以4
        // 非负数 >> 3，等同于除以8
        // 非负数 >> i，等同于除以2的i次方
        // 只有非负数符合这个特征，负数不要用
        int o = 10;
        System.out.println(o);
        System.out.println(o << 1);
        System.out.println(o << 2);
        System.out.println(o << 3);
        System.out.println(o >> 1);
        System.out.println(o >> 2);
        System.out.println(o >> 3);
        System.out.println("===k===");


    }

    public static Boolean returnTrue(){
        System.out.println("true come in");
        return Boolean.TRUE;
    }

    public static Boolean returnFalse(){
        System.out.println("false come in");
        return Boolean.FALSE;
    }
}
